/**
 * 手写5个实用的高阶函数
 */


//防抖函数
const debounce = (fn,delay=3000)=>{ //接收一个函数和一个延迟时间
    let timer = null; //定义一个定时器
    return function(...args){ //返回一个函数,...args来自于剩余参数
        if(timer) clearTimeout(timer); //如果定时器存在，清除定时器,这里形成了闭包,用于保存定时器的状态
        timer = setTimeout(() => { //否则设置一个定时器
            fn.apply(this,args);
            console.log(this)//这个this是外层的this,也就是返回出去函数的this,谁调用返回出去的函数就指向谁
        },delay)
    }
}

const newFN=debounce(
    ()=>{
        console.log('123')
    }
)

newFN()
newFN()
newFN()// 只执行最后一次

//节流函数
const throttle=(fn,delay=3000)=>{
    let last = 0 
    return function(...args){
        let now = Date.now() //获取到当前时间戳
        if(now-last>delay){//第一次进来肯定会执行,因为now一定会大于delay
            fn.apply(this,args)
            last = now //将last设置成上一次调用的now
        }
    }
}

const throttleFn=throttle(()=>{
    console.log('333')
})

throttleFn()
throttleFn()
throttleFn()